package dons;

import java.util.ArrayList;

import classes.EClasses;

import competences.ECompetence;
import data.De;

import equipement.EArme;

public abstract class Don {

	//Pour tous
	protected ArrayList<EDons> donsNecessaires;
	protected EClasses classeNecessaire;
	protected int bbaNecessaire;
	protected int dexNecessaire;
	protected boolean multiple; //Si on peut prendre ce dons plusieurs fois
	protected String description;
	protected boolean prenable;
	private boolean pris;
	
	//Pour des dons particuliers
	protected ArrayList<EArme> armesChoisies; //Dans le cas d'un don pour une arme particuliere (ex : arme de predilection)
	protected ArrayList<ECompetence> competencesChoisies; //Dans le cas d'un don pour une competence particuliere (ex : talent)
	protected int nbPris = 0; //Dans le cas où on peut prendre plusieurs fois ce don sans choisir d'armes ou de competence (ex : vigueur)
	
	public Don () {
		pris = false;
	}
	
	public ArrayList<EDons> getDonsNecessaires () {
		return donsNecessaires;
	}
	
	public EClasses getClasseNecessaire () {
		return classeNecessaire;
	}

	public int getBbaNecessaire() {
		return bbaNecessaire;
	}

	public int getDexNecessaire() {
		return dexNecessaire;
	}
	
	public boolean prends (EArme arme, ECompetence comp) {
		if (multiple) {
			//Si le don est prenable pour differentes armes
			if (armesChoisies != null) {
				//Si l'arme a été donnée, on sélectionne cette arme
				if (arme != null) {
					if (armesChoisies.contains(arme))
						return false;
					armesChoisies.add(arme);
					pris = true;
					return true;
				}
				//Sinon on en sélectionne une au hasard
				else {
					EArme armeTire = EArme.values()[De.lancer(EArme.values().length)-1];
					while (armesChoisies.contains(armeTire))
						armeTire = EArme.values()[De.lancer(EArme.values().length)-1];
					
					armesChoisies.add(armeTire);
					pris = true;
					return true;
				}
			}
			//Si le don est prenable pour differentes compétences
			else if (competencesChoisies != null) {
				//Si la compétence a été donnée, on sélectionne cette compétence
				if (comp != null) {
					if (competencesChoisies.contains(comp))
						return false;
					competencesChoisies.add(comp);
					pris = true;
					return true;
				}
				//Sinon on en sélectionne une au hasard
				else {
					ECompetence compTire = ECompetence.values()[De.lancer(ECompetence.values().length)-1];
					while (competencesChoisies.contains(compTire))
						compTire = ECompetence.values()[De.lancer(ECompetence.values().length)-1];
					
					competencesChoisies.add(compTire);
					pris = true;
					return true;
				}
			}
			else {
				nbPris++;
				pris = true;
				return true;
			}
		}
		else {
			pris = true;
			return true;
		}
		
	}
	
	public boolean estPris () {
		return pris;
	}
	
	public boolean estPrenable () {
		return prenable;
	}
	
	public boolean estMultiple () {
		return multiple;
	}
	
	@Override
 	public String toString() {
		String retour = this.getClass().getSimpleName();
		
		if (multiple) {
			retour += "(";
			if (armesChoisies != null) {
				for (EArme arme : armesChoisies) {
					retour += arme + ", ";
				}
				retour = retour.substring(0, retour.length()-2);
			}
			else if (competencesChoisies != null) {
				for (ECompetence comp : competencesChoisies) {
					retour += comp + ", ";
				}
				retour = retour.substring(0, retour.length()-2);
			}
			else
				retour += multiple + "fois";
			
			retour += ")";
		}
		return retour;
	}
}
